package service;

import java.util.Calendar;
import java.util.Collection;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import model.Locacao;
import model.Locavel;

public class LocacaoDAO extends GenericDAOImpl<Locacao> {
	
	public LocacaoDAO(EntityManager em) {
		super.entityManager = em;
	}
	
	public Locacao criaLocacao(Calendar dataEntrega, Calendar dataLocacao,
			Collection<Locavel> listaLocaveis, Long multa) {
		Locacao loc = new Locacao();
		loc.setDataEntrega(dataEntrega);
		loc.setDataLocacao(dataLocacao);
		loc.setListaLocaveis(listaLocaveis);
		loc.setMulta(multa);
		insereObjeto(loc);
		
		return loc;
	}

	@Override
	public Locacao localizaObjeto(Long objId) {
		Locacao obj = entityManager.getReference(Locacao.class, objId);
		return obj;
	}

	@Override
	public List<Locacao> listaObjetos() {
		TypedQuery<Locacao> query = entityManager.createQuery(
				"SELECT e FROM Locacao e", Locacao.class);
		return query.getResultList();
	}

	@Override
	public void deletaObjetos() {
		TypedQuery<Locacao> query = entityManager.createQuery(
				"DELETE FROM Locacao", Locacao.class);
		query.executeUpdate();
	}

	public boolean verificaDisponibilidade(Collection<Locavel> listaLocaveis) {
		for (Locavel locavel : listaLocaveis) {
			int totalLocados = locavel.getTotalLocados();
			locavel.setTotalLocados(totalLocados++);
		}
		
		for (Locavel locavel : listaLocaveis) {
			if (locavel.getTotalLocados() > locavel.getTotalUnidades()) {
				rollBackTotalLocados(listaLocaveis);
				return false;
			}
		}
		return true;
	}
	
	private void rollBackTotalLocados(Collection<Locavel> listaLocaveis) {
		for (Locavel locavel : listaLocaveis) {
			int totalLocados = locavel.getTotalLocados();
			locavel.setTotalLocados(totalLocados--);
		}
	}

}
